package com.trabalho1.db.dao;

import com.trabalho1.db.ConnectionFactory;
import com.trabalho1.model.ModelUsuario;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class DaoUsuario 
{    
    private Connection con;
    private PreparedStatement stmt;
    
    private void executeSQL(String sql) 
    {
        try 
        {
            con  = ConnectionFactory.getConnection();
            stmt = con.prepareStatement(sql);
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(DaoUsuario.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    private void closeConnection() 
    {
        try 
        {
            stmt.close();
            con.close();
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(DaoUsuario.class.getName()).log(Level.SEVERE, null, ex);
        }
    }    

    public void insert(ModelUsuario mdlUsuario)
    {
        this.executeSQL("INSERT INTO usuario (nome, email, senha) VALUES (?, ?, ?)");
       
        try 
        {
            stmt.setString(1, mdlUsuario.getNome());
            stmt.setString(2, mdlUsuario.getEmail());
            stmt.setString(3, mdlUsuario.getSenha());
            stmt.execute();

        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(DaoUsuario.class.getName()).log(Level.SEVERE, null, ex);
        } 
        finally 
        {
            this.closeConnection();
        }
    }
    
    public void update(ModelUsuario mdlUsuario) 
    {
        this.executeSQL("UPDATE usuario SET nome = ?, email = ?, senha = ? WHERE id_usuario = ?");
        
        try 
        {
            stmt.setString(1, mdlUsuario.getNome());
            stmt.setString(2, mdlUsuario.getEmail());
            stmt.setString(3, mdlUsuario.getSenha());
            stmt.setInt(4, mdlUsuario.getId_usuario());
            stmt.execute();
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(DaoUsuario.class.getName()).log(Level.SEVERE, null, ex);
        }
        finally
        {
            this.closeConnection();
        }
    }

    public void delete(ModelUsuario mdlUsuario)
    {
        this.executeSQL("DELETE FROM usuario WHERE id_usuario = ?");
        
        try 
        {
            stmt.setInt(1, mdlUsuario.getId_usuario());
            stmt.execute();
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(DaoUsuario.class.getName()).log(Level.SEVERE, null, ex);
        }
        finally
        {
            this.closeConnection();
        }
    }    

    public List<ModelUsuario> findAll() 
    {
        List<ModelUsuario> usuarios = new ArrayList<ModelUsuario>();
        
        this.executeSQL("SELECT * FROM usuario ORDER BY nome, id_usuario, email, senha");
        
        ResultSet rset;
        
        try 
        {
            rset = stmt.executeQuery();
            
            while (rset.next()) 
            {
                ModelUsuario mdlUsuario = new ModelUsuario();
                mdlUsuario.setId_usuario(rset.getInt("id_usuario"));
                mdlUsuario.setNome(rset.getString("nome"));
                mdlUsuario.setEmail(rset.getString("email"));
                mdlUsuario.setSenha(rset.getString("senha"));
                usuarios.add(mdlUsuario);
            }
            rset.close();
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(DaoUsuario.class.getName()).log(Level.SEVERE, null, ex);
        }
        finally
        {
            this.closeConnection();
        }
        return usuarios;
    }

    public ModelUsuario findOne(ModelUsuario mdlUsuario)
    {
        Integer id_usuario = mdlUsuario.getId_usuario();
        
        this.executeSQL("SELECT * FROM usuario WHERE id_usuario = ? LIMIT 1");
        ResultSet rset;
        
        try 
        {
            stmt.setInt(1, id_usuario);
            rset = stmt.executeQuery();
            rset.next();
            
            mdlUsuario = new ModelUsuario();
            mdlUsuario.setId_usuario(rset.getInt("id_usuario"));
            mdlUsuario.setNome(rset.getString("nome"));
            mdlUsuario.setEmail(rset.getString("email"));
            mdlUsuario.setSenha(rset.getString("senha"));
         
            rset.close();
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(DaoUsuario.class.getName()).log(Level.SEVERE, null, ex);
        }
        finally
        {
            this.closeConnection();
        }
        
        return mdlUsuario;
    }
    
    public ModelUsuario findByNome(String nome)
    {
        ModelUsuario mdlUsuario = new ModelUsuario();
        
        this.executeSQL("SELECT * FROM usuario WHERE nome = ? LIMIT 1");
        ResultSet rset;
        
        try 
        {
            stmt.setString(1, nome);
            rset = stmt.executeQuery();
            rset.next();
            
            mdlUsuario.setId_usuario(rset.getInt("id_usuario"));
            mdlUsuario.setNome(rset.getString("nome"));
            mdlUsuario.setEmail(rset.getString("email"));
            mdlUsuario.setSenha(rset.getString("senha"));
         
            rset.close();
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(DaoUsuario.class.getName()).log(Level.SEVERE, null, ex);
        }
        finally
        {
            this.closeConnection();
        }
        
        return mdlUsuario;
    }
    
    public ModelUsuario findByEmailAndSenha(String email, String senha)
    {
        ModelUsuario mdlUsuario = new ModelUsuario();
        
        this.executeSQL("SELECT * FROM usuario WHERE email = ? AND senha = ? LIMIT 1");
        ResultSet rset;
        
        try 
        {
            stmt.setString(1, email);
            stmt.setString(2, senha);
            rset = stmt.executeQuery();
            rset.next();
            
            mdlUsuario.setId_usuario(rset.getInt("id_usuario"));
            mdlUsuario.setNome(rset.getString("nome"));
            mdlUsuario.setEmail(rset.getString("email"));
            mdlUsuario.setSenha(rset.getString("senha"));
            
            rset.close();
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(DaoUsuario.class.getName()).log(Level.SEVERE, null, ex);
            
            mdlUsuario.setId_usuario(-1);
            mdlUsuario.setNome(ex.getMessage());
            mdlUsuario.setEmail(null);
            mdlUsuario.setSenha(null);
        }
        finally
        {
            this.closeConnection();
        }
        
        return mdlUsuario;
    }    
}